#include <iostream>
using namespace std;
#include <pthread.h>
#include <unistd.h>
#include <list>

// pthread_mutex_t lock= PTHREAD_MUTEX_INITIALIZER;
// pthread_cond_t cond = PTHREAD_COND_INITIALIZER;//初始化条件变量
// list<int> box;

// void* BuyTicket(void* args)
// {
//     const char* name = (const char*)args;
//     while(true)
//     {
//         pthread_mutex_lock(&lock);
//         if(box.size() > 0)
//         {
//             usleep(1000);
//             printf("%s buy ticket:%d号票\n",name,box.front());
//             box.pop_front();
//             pthread_mutex_unlock(&lock);
//         }
//         else
//         {
//             //去指定条件变量下去等
//             //等的时候会释放锁，被唤醒后会重新申请锁
//             printf("%s waiting on cond\n",name);
//             pthread_cond_wait(&cond,&lock);
//             printf("%s 被唤醒了\n",name);

//             pthread_mutex_unlock(&lock);
//         }
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid1,tid2,tid3,tid4;
//     pthread_create(&tid1,nullptr,BuyTicket,(void*)"pthread-1");
//     pthread_create(&tid2,nullptr,BuyTicket,(void*)"pthread-2");
//     pthread_create(&tid3,nullptr,BuyTicket,(void*)"pthread-3");
//     pthread_create(&tid4,nullptr,BuyTicket,(void*)"pthread-4");
//     sleep(4);
//     int num = 1;
//     while(true)
//     {
//         printf("-----主线程放票咯!-------\n");
//         box.push_back(num);
//         num++;
//         pthread_cond_signal(&cond);
//         sleep(1);
//     }

//     pthread_join(tid1,nullptr);
//     pthread_join(tid2,nullptr);
//     pthread_join(tid3,nullptr);
//     pthread_join(tid4,nullptr);
//     pthread_mutex_destroy(&lock);
//     return 0;
// }

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void *func(void *args)
{
    const char* name = reinterpret_cast<const char*>(args);
    while (true)
    {
        sleep(1);
        pthread_mutex_lock(&mutex);
        pthread_cond_wait(&cond,&mutex);
        printf("我是线程%s\n",name);

        pthread_mutex_unlock(&mutex);
    }
}

int main()
{
    pthread_t tidA, tidB;
    pthread_create(&tidA, nullptr, func, (void*)"A");
    pthread_create(&tidB, nullptr, func, (void*)"B");

    sleep(2);
    printf("main thread start\n");
    while (true)
    {
        pthread_cond_signal(&cond);
        sleep(1);
    }

    pthread_join(tidA, nullptr);
    pthread_join(tidB, nullptr);
    return 0;
}